package com.mmaingenieria.MMAGestor.model;

import java.util.ArrayList;

import org.apache.log4j.Logger;

import com.mmaingenieria.MMAGestor.beans.Usuario;
import com.mmaingenieria.MMAGestor.controller.usuarios.FiltroUsuarios;
import com.mmaingenieria.MMAGestor.database.DAOFactory;
import com.mmaingenieria.MMAGestor.enumerations.EstadoUsuario;
import com.mmaingenieria.MMAGestor.enumerations.RolUsuario;
import com.mmaingenieria.MMAGestor.interfaces.InterfaceUsuarioDAO;

public class ModeloUsuario {
	//Atributos Miembro
	DAOFactory factoriaMySql;
	InterfaceUsuarioDAO interfaceUsuario;

	
	//Constructor vacio
    //****************************************************************************************************************
	public ModeloUsuario() {
		this.factoriaMySql = DAOFactory.getDAOFactory(1);//creamos una factoria de MySql
		this.interfaceUsuario = factoriaMySql.getInterfaceUsuarioDAO();//creamos un interface de tipo Usuario
	}
	
	//Metodo para verificar si exite usuario y pass correcta  y si está activo en el sistema (login)
	//devuelve usuario si user y pass son correctos y si está activo. Sino devuelve usuario a null
	public Usuario verificarLogin (String _user, String _pass)throws Exception{
		Usuario usuario = null;
		try{
			usuario = interfaceUsuario.getUsuarioByUserAndPass(_user, _pass);
			if (usuario == null || EstadoUsuario.Inactivo.equals(usuario.getEstado())){
				usuario = null;
			}
			return usuario;
		}catch (Exception e){
			Logger.getLogger(this.getClass()).error("Excepcion generada verificando login");
			throw e;
		}		
	}
	
	//Metodo que devuelve una listra de Usuarios ya maquetaditos y bonitos
	public ArrayList<Usuario> listarUsuarios (RolUsuario _rol, int _usuario_id) throws Exception{
		try{
			ArrayList<Usuario> listaUsuarios = null;//creo un arraylist de tipo usuarios
			if (RolUsuario.Administrador.equals(_rol)){//Si el rol que me envian (el del uisuario de sesion) es admin recojo toda la lista
				listaUsuarios = interfaceUsuario.getUsuarios();//los recojo del dao
			}
			else {//si el rol es distinto a Administrador entonces solo listamos al usuario que se ha logeado
				listaUsuarios = interfaceUsuario.getUsuarioById(_usuario_id);
			}
			return listaUsuarios;
		}catch (Exception e){
			Logger.getLogger(this.getClass()).error("Excepcion generada generando lista de usuarios");
			throw e;
		}
	}
	
	//Metodo que devuelve una lista de usuarios filtrada
	public ArrayList<Usuario> filtrarUsuarios (FiltroUsuarios _filtro) throws Exception{
		try{
			ArrayList<Usuario> listaUsuarios = null;//creo un arraylist de tipo usuarios
			listaUsuarios = interfaceUsuario.getUsuariosByFilter(_filtro);//los recojo del dao
			return listaUsuarios;
		}catch (Exception e){
			Logger.getLogger(this.getClass()).error("Excepcion generada generando lista de usuarios filtrada");
			throw e;
		}
	}
	
	//Metodo que devuelve un usuario por Id
	public Usuario obtenerUsuario (int _usuario_id) throws Exception{
		try{
			ArrayList<Usuario> listaUsuarios = null;//creo un arraylist de tipo usuarios
			Usuario usuario=null;//me creo un usuario
			listaUsuarios=interfaceUsuario.getUsuarioById(_usuario_id);//los recojo del dao
			//como me llega un arraylist lo paso a un solo usuario.
			 for (Usuario usuario_aux: listaUsuarios){
				 usuario=usuario_aux;
			 }
			return usuario;
		}catch (Exception e){
			Logger.getLogger(this.getClass()).error("Excepcion generada obteniendo un Usuario por Id");
			throw e;
		}
	}
	
	//Metodo que crea un usuario y devuelve el id que ha creado
	public int crearUsuario(Usuario _nuevoUsuario) throws Exception{
		try{
			int id=-1;
			//TODO mirar antes de añadirlo si existe el NIF o el Usuario (que no pueden ser repetidos)
			boolean correcto =interfaceUsuario.addUsuario(_nuevoUsuario);
			if (correcto){
				id = interfaceUsuario.getIdByNif(_nuevoUsuario.getNif());
			}
			return id;
		}catch(Exception e){
			Logger.getLogger(this.getClass()).error("Excepcion generada creando un nuevo usuario y devolviendo su Id");
			throw e;
		}
	}
	//Metodo que modifica un usuario
	public void modificarUsuario(Usuario _nuevoUsuario) throws Exception{
		try{
			//TODO mirar antes de añadirlo si existe el NIF o el Usuario (que no pueden ser repetidos)
			interfaceUsuario.updateUsuario(_nuevoUsuario);
		}catch(Exception e){
			Logger.getLogger(this.getClass()).error("Excepcion generada modificando un usuario");
			throw e;
		}
	}
	
	//Metodo que borra un Usuario
	public boolean borrarUsuario(int _usuario_id)throws Exception{
		boolean resultado = false;
		try{
			boolean accion = interfaceUsuario.actionUsuario(_usuario_id);
			if (accion){
				resultado = interfaceUsuario.deleteUsuario(_usuario_id);
			}
		}catch(Exception e){
			resultado = false;
			Logger.getLogger(this.getClass()).error("Excepcion generada borrando un usuario");
			throw e;
		}
		return resultado;
	}
	
	//Metodo que actualiza la Pass de un usuario
	public boolean cambiarPass (int usuario_id, String nuevaPass) throws Exception{
		boolean resultado= false;
		try{
			resultado=interfaceUsuario.updatePassById(usuario_id, nuevaPass);
		}catch(Exception e){
			resultado = false;
			Logger.getLogger(this.getClass()).error("Excepcion generada cambiando una password");
			throw e;
		}
		return resultado;
	}
	
	//Metodo que actualiza la Pass de un usuario
	public String obtenerPass (int usuario_id) throws Exception{
		String pass = null;
		try{
			pass = interfaceUsuario.getPassById(usuario_id);
		}catch(Exception e){
			pass = null;
			Logger.getLogger(this.getClass()).error("Excepcion generada obteniendo password");
			throw e;
		}
		return pass;
	}
}
